home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / comm / ums / pint.lha / UMS / Rexx / Mails2Guide.pint < prev    next >
Text File  |  1997-03-04  |  11KB  |  478 lines

  1. /* ARexx - Script fuer PINT */
  2.  
  3. /*
  4. ** $VER: Mails2Guide.pint 1.0 (14.04.96) Copyright (c) Kristian Laß.
  5. ** Basierend auf Mails2Guide.mdmrexx 1.3 (25.06.95) Copyright (c) Jürgen Kohrmeyer.
  6. **
  7. ** Updated for PINT (22.2.97):
  8. **  Magnus Heino (nd95mho@Student.HGS.SE)
  9. **
  10. ** Beschreibung:
  11. ** -------------
  12. ** Das Script erstellt aus allen markierten Nachrichten
  13. ** eine Datei im Amigaguide-Format.
  14. **
  15. **
  16. ** Installation:
  17. ** -------------
  18. ** Das Skript selber muß nach Rexx: kopiert werden. Anschließend muß
  19. ** die Konfigurationsvariable PINT.Rexx um eine Zeile ähnlich
  20. ** folgender erweitert werden:
  21. ** ArticleWindow          F7      Mails2Guide.pint
  22. ** Mit Hilfe der entsprechenden F-Taste kann das Skript dann aufgerufen
  23. ** werden.
  24. **
  25. ** Am Anfang des Scripts können einige Parmeter eingestellt werden:
  26. **
  27. ** verzeichnis - Gibt ein Verzeichnis an, das beim Aufruf des
  28. **               Filerequesters als Standard verwendet wird.
  29. **
  30. ** multiview   - Gibt das Anzeigeprogramm für den Guide an, %s
  31. **               dient dabei als Platzhalter für den Namen des
  32. **               Publicscreens von PINT.
  33. **
  34. ** leerzeilen  - Gibt an, ob auf der Titelseite zwischen den
  35. **               einzelnen Threads Leerzeilen stehen sollen.
  36. **               0 = Nein, 1 = Ja
  37. **
  38. ** backups     - Gibt an, ob bei bereits existierendem Guide
  39. **               eine Sicherheitskopie angelegt werden soll.
  40. **               0 = Nein, 1 = Ja
  41. **
  42. **
  43. ** Funktionelle Änderungen gegenüber Mails2Guide.mdmrexx:
  44. ** ------------------------------------------------------
  45. ** Anzahl der Gesamtmails in der Gruppe taucht im Guide nicht mehr auf.
  46. ** Versionsabfrage von MicroDot entfernt
  47. ** Titel der Newsgroup taucht nicht im Guide auf, da programmseitig
  48. ** nicht feststellbar.
  49. ** Eventuell einer Nachricht anhängende Binärfiles werden nicht erwähnt
  50. **
  51. **
  52. ** Autor:
  53. ** ------
  54. ** Kristian Laß            EMail: kristian@ceres.ruhr.de
  55. **
  56. **************************************************************************/
  57.  
  58. /*
  59. ** Startverzeichnis für den Filerequest
  60. */
  61.  
  62. verzeichnis = 'RAM:'
  63.  
  64.  
  65. /*
  66. ** Anzeigeprogramm für den Guide
  67. */
  68.  
  69. multiview   = 'SYS:Utilities/MultiView PUBSCREEN %s'
  70.  
  71.  
  72. /*
  73. ** Leerzeilen zwischen Threads erzeugen? (0 = Nein, 1 = Ja)
  74. */
  75.  
  76. leerzeilen = 1
  77.  
  78.  
  79. /*
  80. ** Sicherheitskopie anlegen? (0 = Nein, 1 = Ja)
  81. */
  82.  
  83. backups = 1
  84.  
  85. /*************************************************************************/
  86.  
  87. /* Konstantendeklarationen aus UMSConsts.rexx: */
  88. /* enumeration of fields in an UMS-message */
  89. UMSCODE_MsgText      =  0
  90. UMSCODE_FromName     =  1
  91. UMSCODE_FromAddr     =  2
  92. UMSCODE_ToName       =  3
  93. UMSCODE_ToAddr       =  4
  94. UMSCODE_MsgID        =  5
  95. UMSCODE_CreationDate =  6
  96. UMSCODE_ReceiveDate  =  7
  97. UMSCODE_RefID        =  8
  98. UMSCODE_Group        =  9
  99. UMSCODE_Subject      = 10
  100. UMSCODE_Attributes   = 11
  101. UMSCODE_Comments     = 12
  102. UMSCODE_Organization = 13
  103. UMSCODE_Distribution = 14
  104. UMSCODE_Folder       = 15
  105. UMSCODE_FidoID       = 16
  106. UMSCODE_MausID       = 17
  107. UMSCODE_ReplyGroup   = 18
  108. UMSCODE_ReplyName    = 19
  109. UMSCODE_ReplyAddr    = 20
  110. UMSCODE_FidoText     = 32
  111. UMSCODE_ErrorText    = 33
  112. UMSCODE_Newsreader   = 34
  113.  
  114. /*
  115. ** Beginn des Scripts
  116. */
  117.  
  118. OPTIONS RESULTS
  119. inport = ADDRESS()
  120.  
  121.  
  122. /*
  123. ** Libraries oeffnen
  124. */
  125.  
  126. IF ~SHOW('LIBRARIES','rexxtricks.library') THEN
  127.    IF ~ADDLIB('rexxtricks.library',0,-30,38) THEN
  128.       EXIT(10)
  129.  
  130. IF ~SHOW('LIBRARIES','rexxsupport.library') THEN
  131.    IF ~ADDLIB('rexxsupport.library',0,-30,0) THEN
  132.       EXIT(10)
  133.  
  134. if ~show("L", "ums.library") then do
  135.   if ~addlib("ums.library", 0, -210, 8) then do
  136.     say "ums.library not found!"
  137.     exit(10)
  138.   end
  139. end
  140.  
  141. GETACCOUNT
  142. Account = UMSLogin("", "@"||result, "default")
  143. If Account = 0 Then exit(20)
  144.  
  145. /*
  146. ** Datum ermitteln
  147. */
  148.  
  149. PARSE VALUE DATE('SORTED') WITH 1 jahr 5 monat 7 tag
  150. datum = tag || '.' || monat || '.' || jahr
  151.  
  152.  
  153. /*
  154. ** Namen der Guide-Datei ermitteln
  155. */
  156.  
  157. INFO "SCREEN"
  158. screenname = result
  159.  
  160. address command "requestfile >t:m2g-verzeichnis "||""""||verzeichnis||""""||" pubscreen "||screenname
  161.  
  162. If ~Open("Dateiname","t:m2g-verzeichnis","r") Then do
  163.    UMSLogout(Account)
  164.    EXIT(0)
  165. end
  166.  
  167. guidename = Strip(ReadLn("Dateiname"),,"""")
  168. Close("Dateiname")
  169. address command "delete t:m2g-verzeichnis"
  170.  
  171. guidename = MAKESUFFIX(guidename,'guide','R')
  172.  
  173.  
  174. /*
  175. ** Prüfen ob die Datei bereits existiert
  176. */
  177.  
  178. anhaengen = 0
  179.  
  180. IF EXISTS(guidename) THEN DO
  181.  
  182. /*   REQUEST '"Mails2Guide-Request"' '"**_Überschreiben|An_hängen|_Abbrechen"' '"Die Datei'||'0A'x||guidename||'0A'x||'existiert bereits."' */
  183.    REQUEST '"Mails2Guide-Request"' '"**_Überschreiben|An_hängen|_Abbrechen"' '"Die Datei '||guidename||' existiert bereits."'
  184.    auswahl=result
  185.  
  186.    IF auswahl = 0 THEN DO
  187.       UMSLogout(Account)
  188.       EXIT(0)
  189.    END
  190.  
  191.    IF auswahl = 2 THEN DO
  192.       anhaengen = 1
  193.  
  194.       IF ~READFILE(guidename,'alt') THEN
  195.          QUIT('Die Datei'||'0A'x||guidename||'0A'x||'kann nicht gelesen werden!',10)
  196.  
  197.       IF LEFT(alt.1,9) ~= '@database' THEN
  198.          QUIT('Die Datei'||'0A'x||guidename||'0A'x||'ist keine AmigaGuide Datei!',10)
  199.    END
  200.  
  201.    IF backups THEN DO
  202.       ADDRESS COMMAND 'copy' guidename guidename||'.bak'
  203.  
  204.       IF rc ~= 0 THEN
  205.          QUIT('Von der Datei'||'0A'x||guidename||'0A'x||'kann keine Sicherheitskopie angelegt werden!',10)
  206.    END
  207. END
  208.  
  209.  
  210. /*
  211. ** Betreffs und Nummern aller markierten Nachrichten ermitteln
  212. */
  213.  
  214. GETSELMSGNUMS
  215. mailnumbers = RESULT
  216. If Words(mailnumbers) = 0 Then do
  217.     UMSLogout(Account)
  218.     exit(0)
  219. end
  220.  
  221. anzmails = Words(mailnumbers)
  222.  
  223. Do i = 0 to anzmails-1
  224.  
  225.       drop mail.
  226.       If ~UMSReadMsgHeader(Account, Word(mailnumbers, i+1), mail.)
  227.           Then leave /* Unlesbare Nachrichten überspringen */
  228.  
  229.       /* Im Array mailpos wurden die Indexpositionen der Nachrichten festgehalten. Statt mailpos(i) kann Word(mailnumbers,i) o.ä. verwendet werden
  230.       mailpos.i = i */
  231.  
  232.       mid.i = mail.UMSCODE_MsgID
  233.       bez.i = mail.UMSCODE_RefID
  234.       bet.i = mail.UMSCODE_Subject
  235.  
  236.       IF mail.UMSCODE_FromName ~= '' THEN DO
  237.          realname.i = mail.UMSCODE_FromName
  238.          abs.i = mail.UMSCODE_FromAddr '(' || mail.UMSCODE_FromName || ')'
  239.       END
  240.       ELSE DO
  241.          realname.i = mail.UMSCODE_FromAddr
  242.          abs.i = mail.UMSCODE_FromAddr
  243.    END
  244. END
  245.  
  246.  
  247.  
  248. /*
  249. ** Guide-Datei anlegen
  250. */
  251.  
  252. IF ~OPEN('guide',guidename,'W') THEN
  253.    QUIT('Die Datei'||'0A'x||guidename||'0A'x||'kann nicht beschrieben werden!',10)
  254.  
  255. CALL WRITELN('guide','@database umsmsgs.guide')
  256. CALL WRITELN('guide','@node main umsmsgs.guide"')
  257. CALL WRITELN('guide','')
  258. CALL WRITELN('guide',' Nachrichten, Stand' datum || ':')
  259.  
  260.  
  261. /*
  262. ** Bezugsnachricht berechnen
  263. ** Anzahl Zeichen berechnen, die jeder Betreff eingerückt werden muß
  264. ** Länge der längsten Zeile einschließlich Einrückung berechnen
  265. */
  266.  
  267. maxlen = 0
  268.  
  269. DO i = 0 TO anzmails-1
  270.    spaces.i = 0
  271.  
  272.    DO x = 1 TO i
  273.       IF mid.x = bez.i THEN DO
  274.          spaces.i = spaces.x+1
  275.          LEAVE
  276.       END
  277.    END
  278.  
  279.    len = LENGTH(bet.i)+spaces.i
  280.    IF len > maxlen THEN
  281.       maxlen = len
  282. END
  283.  
  284.  
  285. /*
  286. ** Zeilenanfänge für Thread berechnen
  287. */
  288.  
  289. anfang.0 = ''
  290.  
  291. DO i = 0 TO anzmails-1
  292.    SELECT
  293.       WHEN spaces.i = 0 THEN anfang.i = ''
  294.       WHEN spaces.i = 1 THEN anfang.i = '·'
  295.  
  296.       OTHERWISE DO
  297.          succ = i+1
  298.          pred = i-1
  299.          anfang.i = LEFT(anfang.pred,spaces.i-1)
  300.  
  301.          IF spaces.i ~= spaces.pred THEN DO
  302.             bezug = 0
  303.  
  304.             DO x = i TO anzmails
  305.                IF bez.x = bez.pred THEN DO
  306.                   anfang.i = OVERLAY('|',anfang.i,spaces.i-1,1)
  307.                   bezug = 1
  308.                   LEAVE
  309.                END
  310.             END
  311.  
  312.             IF ~bezug & spaces.i >= spaces.pred THEN
  313.                anfang.i = OVERLAY(' ',anfang.i,spaces.i-1,1)
  314.          END
  315.  
  316.          anfang.i = OVERLAY('·',anfang.i,spaces.i,1)
  317.       END
  318.    END
  319. END
  320.  
  321.  
  322. /*
  323. ** Alte Titelseite in den Guide übernehmen
  324. */
  325.  
  326. anzaltmails = 0
  327.  
  328. IF anhaengen THEN DO
  329.    DO zeile = 1 TO alt.0
  330.       IF LEFT(alt.zeile,5) = ' @{" ' THEN
  331.          LEAVE
  332.    END
  333.  
  334.    PARSE VAR alt.zeile anfang '" link "' ende
  335.  
  336.    IF LENGTH(anfang)-6 > maxlen THEN
  337.       maxlen = LENGTH(anfang)-6
  338.  
  339.    CALL WRITELN('guide','')
  340.  
  341.    DO zeile = zeile TO alt.0
  342.       nextzeile = zeile+1
  343.  
  344.       IF alt.zeile = '' & LEFT(alt.nextzeile,8) = '@endnode' THEN
  345.          LEAVE
  346.       ELSE DO
  347.          IF alt.zeile ~= '' THEN DO
  348.             PARSE VAR alt.zeile anfang '" link "' ende
  349.             CALL WRITELN('guide',LEFT(anfang,maxlen+6)||'" link "'||ende)
  350.          END
  351.          ELSE
  352.             CALL WRITELN('guide',alt.zeile)
  353.       END
  354.  
  355.       IF alt.zeile ~= '' THEN
  356.          anzaltmails = anzaltmails+1
  357.    END
  358. END
  359. ELSE DO
  360.    IF ~leerzeilen THEN
  361.       CALL WRITELN('guide','')
  362. END
  363.  
  364.  
  365. /*
  366. ** Neue Titelseite schreiben
  367. */
  368.  
  369. DO i = 0 TO anzmails-1
  370.    buttontext = TRANSLATE(LEFT(bet.i,maxlen-spaces.i),"'",'"')
  371.  
  372.    text = ' ' || anfang.i || '@{"' buttontext '" link "nachricht_' || anzaltmails+i || '"}' realname.i
  373.  
  374.    IF spaces.i = 0 & leerzeilen THEN
  375.       CALL WRITELN('guide','')
  376.  
  377.    CALL WRITELN('guide',text)
  378. END
  379.  
  380. CALL WRITELN('guide','')
  381. CALL WRITELN('guide','@endnode')
  382. CALL WRITELN('guide','')
  383.  
  384.  
  385. /*
  386. ** Alte Nachrichten in den Guide übernehmen
  387. */
  388.  
  389. IF anhaengen THEN DO
  390.    DO zeile = zeile+2 TO alt.0
  391.       CALL WRITELN('guide',alt.zeile)
  392.    END
  393. END
  394.  
  395. CALL CLOSE('guide')
  396.  
  397.  
  398. /*
  399. ** Neue Nachrichten in den Guide schreiben
  400. */
  401.  
  402. node.0 = 8
  403. node.2 = ''
  404. node.7 = ''
  405. node.8 = '--------------------------------------------------------------------------'
  406. node.9 = ''
  407.  
  408. endnode.0 = 2
  409. endnode.1 = '@endnode'
  410. endnode.2 = ''
  411.  
  412. binmail.0 = 2
  413. binmail.2 = ''
  414.  
  415. DO i = 0 TO anzmails-1
  416.    drop mail.
  417.    If ~UMSReadMsgAll(Account, Word(mailnumbers, i+1), mail.)
  418.        Then leave /* Unlesbare Nachrichten überspringen */
  419.  
  420.    node.1 = '@node "nachricht_' || anzaltmails+i || '" "' || TRANSLATE(bet.i,"'",'"') || '"'
  421.  
  422.    node.3 = 'Absender:' abs.i
  423.    node.4 = 'Betreff :' bet.i
  424.    node.5 = 'Datum   :' mail.UMSCODE_CreationDate   /* Wegen des nicht festgelegten Datumsformates ist einfaches Verarbeiten nicht möglich */
  425.    node.6 = 'MsgID   :' mid.i
  426.  
  427.    IF ~WRITEFILE(guidename,'node','A') THEN
  428.       QUIT('Fehler beim Schreiben der Nachrichten!',10)
  429.  
  430.    /* Teil zur Bearbeitung von Binärnachrichten entfernt */
  431.  
  432.    IF OPEN('guide',guidename,'A') THEN
  433.         If Writech('guide',mail.UMSCODE_MsgText)=0 Then
  434.             QUIT('Schreiben eines Nachrichteninhalts fehlgeschlagen!',10)
  435.         Else
  436.             Close('guide')
  437.    Else
  438.        QUIT('Schreiben eines Nachrichteninhalts fehlgeschlagen!',10)
  439.  
  440.    IF ~WRITEFILE(guidename,'endnode','A') THEN
  441.       QUIT('Fehler beim Schreiben der Nachrichten!',10)
  442. END
  443.  
  444. SETPOS 0
  445.  
  446. /*
  447. ** Logoff durchführen
  448. */
  449. UMSLogout(Account)
  450.  
  451.  
  452. /*
  453. ** Gerade erstellten Guide anzeigen
  454. */
  455.  
  456. position = POS('%S',UPPER(multiview))
  457.  
  458. IF position ~= 0 THEN
  459.    commandstring = LEFT(multiview,position-1) || inport || SUBSTR(multiview,position+2) guidename
  460. ELSE
  461.    commandstring = multiview guidename
  462.  
  463. ADDRESS COMMAND commandstring
  464.  
  465. EXIT(0)
  466.  
  467.  
  468. /*
  469. ** Script mit Fehlermeldung beenden
  470. */
  471.  
  472. quit:
  473.    PARSE ARG msg,rcode
  474.  
  475.    UMSLogout(Account)
  476.    REQUEST '"Mails2Guide-Request" "**_Abbrechen" "'||msg||'"'
  477.    EXIT(rcode)
  478.